/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package bs.ventas.modelo;


import bs.entidad.modelo.EntidadComercial;
import bs.global.modelo.Auditoria;
import bs.global.modelo.CondicionDeIva;
import bs.global.modelo.Formulario;
import bs.global.modelo.Moneda;
import bs.global.modelo.Provincia;
import bs.global.modelo.Sucursal;
import bs.global.modelo.Zona;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;


/**
 *
 * @author ctrosch
 */
@Entity
@Table(name = "vt_movimiento")
public class MovimientoVenta implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)    
    @Column(name = "ID")
    private Integer id;

    //Comprobante de Venta
    @JoinColumns({
    @JoinColumn(name = "MODCOM", referencedColumnName = "MODCOM"),
    @JoinColumn(name = "CODCOM", referencedColumnName = "CODCOM")
    })
    @ManyToOne(fetch = FetchType.LAZY)
    ComprobanteVenta comprobante;    
        
    @JoinColumns({
    @JoinColumn(name = "MODFOR", referencedColumnName = "MODFOR"),
    @JoinColumn(name = "CODFOR", referencedColumnName = "CODFOR")
    })
    @ManyToOne(fetch = FetchType.LAZY)
    Formulario formulario;
            
    @Column(name = "NROFOR")
    private int numeroFormulario;

    //Sucursal o punto de venta
    @JoinColumn(name = "SUCURS", referencedColumnName = "CODIGO")
    @ManyToOne(fetch = FetchType.LAZY)
    private Sucursal sucursal;

    @Basic(optional = false)
    @Column(name = "IMPTCN", length = 6)
    private String imputacionCuentaCorriente;

    //Observaciones textos
    @Lob
    @Column(name = "OBSERV", length = 2147483647)
    private String observaciones;
    @Basic(optional = false)

    //Fecha del movimiento
    @Column(name = "FCHMOV")
    @Temporal(TemporalType.DATE)
    private Date fechaMovimiento;
            
    @Column(name = "FCHVEN")
    @Temporal(TemporalType.DATE)
    private Date fechaVencimiento;
    
    //Cliente
    @JoinColumn(name = "NROCTA", referencedColumnName = "NROCTA")
    @ManyToOne(fetch = FetchType.LAZY)
    private EntidadComercial cliente;

    //EntidadComercial
    @JoinColumn(name = "NROSUB", referencedColumnName = "NROCTA", nullable = true)
    @ManyToOne(fetch = FetchType.LAZY)
    private EntidadComercial clienteCuentaCorriente;

    //Condicion de pago
    @JoinColumn(name = "CNDPAG", referencedColumnName = "CODIGO")
    @ManyToOne(fetch = FetchType.LAZY)
    private CondicionDePagoVenta condicionDePago;

    //VT_Vendedor
    @JoinColumn(name = "VNDDOR", referencedColumnName = "CODIGO", nullable = true)
    @ManyToOne(fetch = FetchType.LAZY)
    private Vendedor vendedor;
    
    @JoinColumn(name = "COBRAD", referencedColumnName = "CODIGO", nullable = true)
    @ManyToOne(fetch = FetchType.LAZY)
    private Cobrador cobrador;
    
    //Lista de precio
    @JoinColumn(name = "CODLIS", referencedColumnName = "CODIGO")
    @ManyToOne(fetch = FetchType.LAZY)
    private ListaDePrecio listaDePrecio;
    
        //Moneda lista de precios
    @JoinColumn(name = "COFLIS", referencedColumnName = "CODIGO")
    @ManyToOne(fetch = FetchType.LAZY)
    private Moneda monedaListaPrecio;

    //Moneda secundaria
    @JoinColumn(name = "COFSEC", referencedColumnName = "CODIGO")
    @ManyToOne(fetch = FetchType.LAZY)
    private Moneda monedaSecundaria;

    @Column(name = "COTIZA", precision = 15, scale = 4)
    private BigDecimal cotizacion;
    
    @JoinColumns({
        @JoinColumn(name = "CODPRO", referencedColumnName = "CODIGO"),
        @JoinColumn(name = "CODPAI", referencedColumnName = "CODPAI")
    })
    @ManyToOne(fetch = FetchType.LAZY)
    private Provincia provincia;
    
    @JoinColumn(name = "CODZON", referencedColumnName = "CODIGO")
    @ManyToOne(fetch = FetchType.LAZY)
    private Zona zona;

    //Condicion de iva
    @JoinColumn(name = "CNDIVA", referencedColumnName = "CODIGO")
    @ManyToOne(fetch = FetchType.LAZY)
    private CondicionDeIva condicionDeIva;

    @Column(name = "NROCAE", length = 20)
    private String numeroCAE;
    @Column(name = "VENCAE")
    @Temporal(TemporalType.DATE)
    private Date vencimientoCAE;        
    @Column(name = "TIPEXP", length = 6)
    private String tipoExportacion;

    @OneToMany(mappedBy = "movimiento", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    private List<ItemProductoVenta> itemProducto;

    @OneToMany(mappedBy = "movimiento", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    private List<ItemImpuestoVenta> itemImpuesto;

    @OneToMany(mappedBy = "movimiento", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    private List<ItemBonificacionVenta> itemBonificacion;

    @OneToMany(mappedBy = "movimiento", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    private List<ItemPercepcionVenta> itemPercepcion;

    @OneToMany(mappedBy = "movimiento", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    private List<ItemTotalVenta> itemTotal;
        
    @Embedded
    private Auditoria auditoria;

    @Transient
    private BigDecimal subtotalConIVA;

    @Transient
    private BigDecimal subtotalSinIVA;



    public MovimientoVenta() {
        
        this.cotizacion = BigDecimal.ONE;
        
        itemProducto = new ArrayList<ItemProductoVenta>();        
        itemImpuesto = new ArrayList<ItemImpuestoVenta>();
        itemPercepcion = new ArrayList<ItemPercepcionVenta>();
        itemBonificacion = new ArrayList<ItemBonificacionVenta>();
        itemTotal = new ArrayList<ItemTotalVenta>();
        
        auditoria = new Auditoria();
    }

    public MovimientoVenta(Integer id) {
        
        this.id = id;
        this.cotizacion = BigDecimal.ONE;
        
        itemProducto = new ArrayList<ItemProductoVenta>();        
        itemImpuesto = new ArrayList<ItemImpuestoVenta>();
        itemPercepcion = new ArrayList<ItemPercepcionVenta>();
        itemBonificacion = new ArrayList<ItemBonificacionVenta>();
        itemTotal = new ArrayList<ItemTotalVenta>();
        
        auditoria = new Auditoria();
    }

    public MovimientoVenta(Integer id, String codcom, Date fchmov, EntidadComercial cliente) {
        this.id = id;
        this.fechaMovimiento = fchmov;
        this.cliente = cliente;     
        
        this.cotizacion = BigDecimal.ONE;
        
        itemProducto = new ArrayList<ItemProductoVenta>();        
        itemImpuesto = new ArrayList<ItemImpuestoVenta>();
        itemPercepcion = new ArrayList<ItemPercepcionVenta>();
        itemBonificacion = new ArrayList<ItemBonificacionVenta>();
        itemTotal = new ArrayList<ItemTotalVenta>();
        
        auditoria = new Auditoria();
        
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public ComprobanteVenta getComprobante() {
        return comprobante;
    }

    public void setComprobante(ComprobanteVenta comprobante) {
        this.comprobante = comprobante;
    }

    public Formulario getFormulario() {
        return formulario;
    }

    public void setFormulario(Formulario formulario) {
        this.formulario = formulario;
    }

    public int getNumeroFormulario() {
        return numeroFormulario;
    }

    public void setNumeroFormulario(int numeroFormulario) {
        this.numeroFormulario = numeroFormulario;
    }

    public Sucursal getSucursal() {
        return sucursal;
    }

    public void setSucursal(Sucursal sucursal) {
        this.sucursal = sucursal;
    }

    public String getImputacionCuentaCorriente() {
        return imputacionCuentaCorriente;
    }

    public void setImputacionCuentaCorriente(String imputacionCuentaCorriente) {
        this.imputacionCuentaCorriente = imputacionCuentaCorriente;
    }
    
    public String getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }

    public Date getFechaMovimiento() {
        return fechaMovimiento;
    }

    public void setFechaMovimiento(Date fechaMovimiento) {
        this.fechaMovimiento = fechaMovimiento;
    }

    public Date getFechaVencimiento() {
        return fechaVencimiento;
    }

    public void setFechaVencimiento(Date fechaVencimiento) {
        this.fechaVencimiento = fechaVencimiento;
    }

    public EntidadComercial getCliente() {
        return cliente;
    }

    public void setCliente(EntidadComercial cliente) {
        this.cliente = cliente;
    }

    public EntidadComercial getClienteCuentaCorriente() {
        return clienteCuentaCorriente;
    }

    public void setClienteCuentaCorriente(EntidadComercial clienteCuentaCorriente) {
        this.clienteCuentaCorriente = clienteCuentaCorriente;
    }

    public CondicionDePagoVenta getCondicionDePago() {
        return condicionDePago;
    }

    public void setCondicionDePago(CondicionDePagoVenta condicionDePago) {
        this.condicionDePago = condicionDePago;
    }

    public Vendedor getVendedor() {
        return vendedor;
    }

    public void setVendedor(Vendedor vendedor) {
        this.vendedor = vendedor;
    }

    public Cobrador getCobrador() {
        return cobrador;
    }

    public void setCobrador(Cobrador cobrador) {
        this.cobrador = cobrador;
    }

    public ListaDePrecio getListaDePrecio() {
        return listaDePrecio;
    }

    public void setListaDePrecio(ListaDePrecio listaDePrecio) {
        this.listaDePrecio = listaDePrecio;
    }

    public Moneda getMonedaListaPrecio() {
        return monedaListaPrecio;
    }

    public void setMonedaListaPrecio(Moneda monedaListaPrecio) {
        this.monedaListaPrecio = monedaListaPrecio;
    }

    public Moneda getMonedaSecundaria() {
        return monedaSecundaria;
    }

    public void setMonedaSecundaria(Moneda monedaSecundaria) {
        this.monedaSecundaria = monedaSecundaria;
    }

    public BigDecimal getCotizacion() {
        return cotizacion;
    }

    public void setCotizacion(BigDecimal cotizacion) {
        this.cotizacion = cotizacion;
    }

    public Provincia getProvincia() {
        return provincia;
    }

    public void setProvincia(Provincia provincia) {
        this.provincia = provincia;
    }
    
    public Zona getZona() {
        return zona;
    }

    public void setZona(Zona zona) {
        this.zona = zona;
    }

    public CondicionDeIva getCondicionDeIva() {
        return condicionDeIva;
    }

    public void setCondicionDeIva(CondicionDeIva condicionDeIva) {
        this.condicionDeIva = condicionDeIva;
    }

    public String getNumeroCAE() {
        return numeroCAE;
    }

    public void setNumeroCAE(String numeroCAE) {
        this.numeroCAE = numeroCAE;
    }

    public Date getVencimientoCAE() {
        return vencimientoCAE;
    }

    public void setVencimientoCAE(Date vencimientoCAE) {
        this.vencimientoCAE = vencimientoCAE;
    }

    public String getTipoExportacion() {
        return tipoExportacion;
    }

    public void setTipoExportacion(String tipoExportacion) {
        this.tipoExportacion = tipoExportacion;
    }

    public List<ItemProductoVenta> getItemProducto() {
        return itemProducto;
    }

    public void setItemProducto(List<ItemProductoVenta> itemProducto) {
        this.itemProducto = itemProducto;
    }

    public List<ItemImpuestoVenta> getItemImpuesto() {
        return itemImpuesto;
    }

    public void setItemImpuesto(List<ItemImpuestoVenta> itemImpuesto) {
        this.itemImpuesto = itemImpuesto;
    }

    public List<ItemBonificacionVenta> getItemBonificacion() {
        return itemBonificacion;
    }

    public void setItemBonificacion(List<ItemBonificacionVenta> itemBonificacion) {
        this.itemBonificacion = itemBonificacion;
    }

    public List<ItemPercepcionVenta> getItemPercepcion() {
        return itemPercepcion;
    }

    public void setItemPercepcion(List<ItemPercepcionVenta> itemPercepcion) {
        this.itemPercepcion = itemPercepcion;
    }

    public List<ItemTotalVenta> getItemTotal() {
        return itemTotal;
    }

    public void setItemTotal(List<ItemTotalVenta> itemTotal) {
        this.itemTotal = itemTotal;
    }

    public Auditoria getAuditoria() {
        return auditoria;
    }

    public void setAuditoria(Auditoria auditoria) {
        this.auditoria = auditoria;
    }

    public BigDecimal getSubtotalConIVA() {
        subtotalConIVA = BigDecimal.ZERO;

        if(itemProducto!=null){
            for(ItemProductoVenta i: itemProducto){
            subtotalConIVA = subtotalConIVA.add(i.getTotalLineaConIVA());
            }
        }
        return subtotalConIVA;
    }

    public void setSubtotalConIVA(BigDecimal subtotalConIVA) {
        this.subtotalConIVA = subtotalConIVA;
    }

    public BigDecimal getSubtotalSinIVA() {
        subtotalSinIVA = BigDecimal.ZERO;

        if(itemProducto!=null){
            for(ItemProductoVenta i: itemProducto){
            subtotalSinIVA = subtotalSinIVA.add(i.getImporte());
            }
        }
        return subtotalSinIVA;        
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof MovimientoVenta)) {
            return false;
        }
        MovimientoVenta other = (MovimientoVenta) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "tv.venta.modelo.MovimientoVenta[id=" + id + "]";
    }

}
